home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / CRS / crs21.d81 / hiressrl.sfx / hiscroll.ebud < prev   
Text File  |  1990-02-12  |  8KB  |  343 lines

  1. ; "HIRES SCROLL" IS A DEMONSTRATION PROGRAM
  2. ; TO SHOW HOW TO SMOOTH SCROLL A HIRES
  3. ; BITMAP SCREEN.
  4. ;
  5. ; ┬Y ╩OHN ╠EESON, ┴UGUST 19, 1990
  6. ;    ╤-╠INK ╨ROGRAMMERS' ╫ORKSHOP
  7. ;
  8. ; ┴ HIRES BITMAP SCREEN SHOULD BE LOADED
  9. ; AT $6000 BEFORE ENTERING THIS ROUTINE.
  10. ; ╘HE COLOR ARRAY SHOULD BE AT $5C00 FOR
  11. ; THIS SCREEN. $8800 IS USED FOR THE 
  12. ; ALTERNATE SCREEN COLOR ARRAY, AND
  13. ; $A000 IS USED FOR THE ALTERNATE BITMAP.
  14. ; ╘HE COLOR ARRAY IS MOVED TO $4800 SO
  15. ; THAT THE ╓╔├ CHIP CAN SEE IT IN BANK 2.
  16. ; ╘HIS IS THE CORRECT SETUP FOR ─OODLE
  17. ; (DD FILES) GRAPHICS.
  18. ;
  19. .ORG $C000
  20. .MEM
  21. ;.DIS
  22. .DVO 10
  23. ;.OBJ "HISCROLL.C000"
  24. ;  SOURCE IS HIRES SCROLL.SRC
  25. ;
  26. ; ** ZERO PAGE WORK AREA **
  27. ;
  28. SAPTR = $FB   ;POINTER TO SCREEN A
  29. SBPTR = $FD   ;POINTER TO SCREEN B
  30. LCOLA = $19   ;LEFT COL SCREEN A PTR
  31. ;
  32. ; ** SYSTEM POINTERS **
  33. ;
  34. IRQVEC = $314 ;╔╥╤ VECTOR
  35. ;
  36. ; ** ASSEMBLER CONSTANTS **
  37. ;
  38. VB2 = %01     ;╓╔├ CHIP VIDEO BANK BITS
  39. VB1 = %10     ;  FOR BANK 2 AND BANK 1
  40. BMADR = $28   ;$0800 COLOR, $2000 BITMAP
  41. BMMODE = $20  ;ENABLE BIT MAP IN YCR
  42. DEBUG = 0     ;CONDITIONAL ASSY FLAG
  43. SCRCNT = 5    ;SCROLL COUNTER. ├AN BE AS
  44. ;          LOW AS 2, NO LOWER.
  45. VICXCRDATA = $07 ;MAKE $0F FOR 40 COL SCREEN
  46. ;
  47. ; ** ╔/╧ REGISTERS
  48. ;
  49. CIA2DRA = $DD00 ;VIDEO BANK BITS 0-1
  50. VICMCR  = $D018 ;VIC MEMORY CTRL REG
  51. VICYCR  = $D011 ;VIC CTRL REG Y
  52. VICRCR  = $D012 ;VIC RASTER CMP REG
  53. VICXCR  = $D016 ;VIC CTRL REG X
  54. CIA1ICR = $DC0D ;CIA 1 INT CTRL REG
  55. VICIFR  = $D019 ;VIC INT FLAG REG
  56. VICIMR  = $D01A ;VIC INT MASK REG
  57. CPUIO   = $01   ;PROCESSOR I/O
  58. ;
  59. START = *       ;SETUP ╔╥╤
  60.   SEI
  61.   LDA IRQVEC:STA OLDIRQ
  62.   LDA IRQVEC+1:STA OLDIRQ+1
  63.   LDA #<NEWIRQ:STA IRQVEC
  64.   LDA #>NEWIRQ:STA IRQVEC+1
  65. ; SETUP FOR RASTER ╔╥╤ ON LINE 250
  66.   LDA #$7F:STA CIA1ICR  ;DISABLE CIA ╔╥╤
  67.   LDA CIA1ICR           ;RESET PENDING
  68.   LDA VICYCR:AND #$7F:STA VICYCR ;RASTER HIBIT
  69.   LDA #$FA:STA VICRCR   ;RASTER CMP LINE 250
  70.   LDA #$01:STA VICIMR   ;ENABLE RASTER IRQ
  71.   LDA VICIFR:STA VICIFR ;RESET PENDING
  72. ; SETUP FOR INITIAL BITMAP DISPLAY SCREEN A
  73.   LDA VICYCR:ORA #BMMODE:STA VICYCR
  74.   LDA #BMADR:STA VICMCR
  75. ;
  76. POKEPLACE = *+1
  77.   LDA #SCRCNT:STA COUNTER ;SETUP TIME DELAY
  78.   STA COUNTGONE+1       ;SELF MODIFYING CODE
  79. ;
  80.   LDA #$00              ;SETUP SCREEN VARS
  81.   STA SCREENA:STA SCREENB
  82.   STA SAPTR:STA SBPTR
  83.   LDA #$60:STA SCREENA+1
  84.   LDA #$A0:STA SCREENB+1
  85.   LDA #VB1:STA VBANKA
  86.   LDA #VB2:STA VBANKB
  87. ; START WITH SCREEN A
  88.   LDA CIA2DRA:AND #$FC:ORA VBANKA:STA CIA2DRA
  89. ;
  90.   LDA #$5C:STA SAPTR+1  ;DOODLE COLOR LOCATION
  91.   LDA #$48:STA SBPTR+1  ;WHERE WE WANT IT
  92.   LDX #25        ;COUNTERS
  93. - LDY #0
  94. - LDA (SAPTR),Y
  95.   STA (SBPTR),Y
  96.   INY:CPY #40:BNE -     ;MOVE COLOR ARRAY
  97.   DEX:BEQ +
  98.   JSR ADD40
  99.   CLC:BCC --
  100. ;
  101. + LDA CPUIO:AND #$FE:STA CPUIO
  102.   JSR MOVE2B            ;MOVES A TO B WITH SHIFT
  103.   LDA CPUIO:ORA #$01:STA CPUIO
  104. ;
  105.   CLI                   ;KICK IT OFF
  106.   RTS
  107. ;
  108. ; ** LOCAL VARIABLES **
  109. ;
  110. OLDIRQ  .WORD 0      ;SAVED ╔╥╤
  111. SCREENA .WORD $6000  ;$2000 IN VID BNK 1
  112. SCREENB .WORD $A000  ;$2000 IN VID BNK 2
  113. VBANKA  .BYTE VB1    ;BANK FOR SCRN A
  114. VBANKB  .BYTE VB2    ;BANK FOR SCRN B
  115. COUNTER .BYTE SCRCNT ;DELAY COUNTER FOR SCROLL
  116. WORK    .BYTE 0,0    ;DEBUG COUNTERS
  117. ;
  118. NEWIRQ = *           ;ENTER HERE WITH ╔╥╤
  119.   LDA VICIFR:STA VICIFR  ;RESET PENDING
  120. ;
  121. ; ╘EST CODE:
  122.   .IF DEBUG
  123.   INC WORK           ;INCREMENT ╔╥╤ COUNTER
  124.   .IFE
  125. ;
  126.   DEC COUNTER
  127.   BEQ COUNTGONE      ;SCROLL IF TIME GONE
  128.   JMP (OLDIRQ)       ;ELSE EXIT
  129. ;
  130. COUNTGONE = *
  131.   LDA #SCRCNT        ;RESET COUNTER
  132.   STA COUNTER
  133.   LDA VICXCR         ;GET CURRENT SCROLL POSITION
  134.   AND #$07
  135.   BEQ MOVESCREEN     ;IF SCROLL IS AT 0
  136.   DEC VICXCR         ;ELSE SCROLL AND EXIT
  137.   JMP (OLDIRQ)
  138. ;
  139. ; ╚ERE IT IS TIME TO SWAP SCREENS, RESET
  140. ; THE SCROLL POSITION TO 7, THEN START
  141. ; MOVING THE SCREEN LEFT 8 BITS.
  142. ;
  143. MOVESCREEN = *
  144. ; ** TEST CODE **
  145.   .IF DEBUG
  146.   STA WORK           ;RESET ╔╥╤ COUNTER (.┴ = 0)
  147.   .IFE
  148. ; ** END TEST CODE **
  149.   LDA CPUIO          ;BANK ┬┴╙╔├ ╥╧═ OUT
  150.   AND #$FE
  151.   STA CPUIO
  152.   LDA CIA2DRA
  153.   AND #$FC
  154.   ORA VBANKB         ;SHOW SCRN B
  155. ; ╘HE VALUE IN VBANKB TOGGLES BETWEEN
  156. ; SCREEN 1 AND SCREEN 2, SO THIS TOGGLES
  157. ; BETWEEN THE TWO SCREENS.
  158.   STA CIA2DRA
  159.   LDA #VICXCRDATA
  160.   STA VICXCR         ;SCROLL POS TO 7
  161.   CLI                ;!?
  162. ;
  163. ; ╞ROM THIS POINT ON ANOTHER ╔╥╤ CAN 
  164. ; OCCUR. ╔F IT DOES, THEN THE TOP PART
  165. ; OF THIS ROUTINE WILL EXECUTE AGAIN 
  166. ; WHILE THE FOLLOWING PART IS STILL
  167. ; EXECUTING. ╘HE TOP PART WILL EXECUTE
  168. ; 8 TIMES COUNTER TIMES BEFORE IT FALLS
  169. ; INTO THE MOVE SCREEN PART, HOWEVER, SO
  170. ; THE FOLLOWING HAS ABOUT 1.1 SECOND TO 
  171. ; FINISH MOVING THE SCREEN BITMAPS 
  172. ; AROUND, WITH THE DEFAULT COUNTER OF 5
  173. ;
  174. ; ╞IRST, SWAP THE SCREEN POINTERS SO
  175. ; THAT SCREEN A AND SCREEN B ARE REVERSED.
  176. ;
  177. JSR SWAPSCREENS
  178. ;
  179. ; ╘HEN MOVE SCREEN DATA TO SCREEN B
  180. ; SHIFTED LEFT 8 BITS
  181. ;
  182. JSR MOVE2B
  183. ;
  184. ; ╥ESTORE ┬┴╙╔├ ╥╧═
  185. ; AND EXIT THROUGH THE OLDIRQ.
  186. ;
  187. IRQOUT = *
  188.   LDA CPUIO:ORA #$01:STA CPUIO
  189.   JMP (OLDIRQ)
  190. ;
  191. ; ** ┴LL DONE **
  192. ;
  193. SWAPSCREENS = *  ;EXCHANGES POINTERS
  194. ; FIRST THE BANK PTRS
  195.   LDA VBANKA:LDX VBANKB
  196.   STX VBANKA:STA VBANKB
  197. ; THEN THE SCREEN PNTRS
  198.   LDA SCREENA:LDX SCREENB
  199.   STX SCREENA:STA SCREENB
  200.   LDA SCREENA+1:LDX SCREENB+1
  201.   STX SCREENA+1:STA SCREENB+1
  202.   RTS
  203. ;
  204. ; ** ╠OCAL VARIABLES FOR MOVE **
  205. ;
  206. ROWCOUNT .BYTE 0
  207. ;
  208. MOVE2B = *       ;MOVES SCREEN A TO B
  209. ;          WITH A SHIFT LEFT BY 8 BITS
  210. ; ╬OTE: THIS ROUTINE ╫╔╠╠ BE INTERRUPTED
  211. ; BY ANOTHER RASTER ╔╥╤. ┬UT IT IS
  212. ; NOT AFFECTING THE SCREEN THAT IS
  213. ; CURRENTLY BEING DISPLAYED, SO THAT
  214. ; IS OKAY. ╔T MUST ╬╧╘, HOWEVER,
  215. ; AFFECT ANY POINTERS BEING USED TO
  216. ; DISPLAY SCREENS. ╔F IT IS POSSIBLE
  217. ; TO TAKE TOO LONG IN HERE THEN A 
  218. ; FLAG WOULD HAVE TO BE USED IN THE TOP
  219. ; PART OF THE ╔╥╤ TO PREVENT RE-ENTRY
  220. ; INTO THIS CODE WHILE IT IS RUNNING.
  221. ; ** SETUP POINTERS AND COUNTERS **
  222. ; ╞IRST SAVE ┬┴╙╔├ ┌╨ WORK AREA WE NEED
  223.   LDA LCOLA+1:PHA:LDA LCOLA:PHA
  224.   CLC           ;SAPTR TO ONE COL RIGHT OF SBPTR
  225.   LDA SCREENA:STA LCOLA:ADC #8:STA SAPTR
  226.   LDA SCREENA+1:STA LCOLA+1:ADC #0:STA SAPTR+1
  227. ; ╬OTE: LCOLA IS A POINTER TO THE COLUMN THAT
  228. ; WILL GO INTO THE RIGHT COL OF SCREEN B
  229.   LDA SCREENB:STA SBPTR
  230.   LDA SCREENB+1:STA SBPTR+1
  231.   LDA #0:STA ROWCOUNT
  232. ;
  233. ; REPEAT UNTIL 25 ROWS DONE
  234. ;
  235. DOROW = *
  236.   LDX #0            ;COLUMN COUNTER
  237. ;
  238. ; REPEAT UNTIL 40 COL DONE
  239. ;
  240. - LDY #7
  241. - LDA (SAPTR),Y
  242.   STA (SBPTR),Y
  243.   DEY:BPL -         ;MOVE 8 BYTES
  244.   JSR ADD8          ;ADD 8 TO POINTERS
  245.   INX               ;COLUMN COUNT
  246.   CPX #39
  247.   BNE --            ;UNTIL 39 COL DONE
  248.   LDY #7            ;NOW DO THE LEFT COL
  249. - LDA (LCOLA),Y
  250.   STA (SBPTR),Y     ;INTO RIGHT COL OF B
  251.   DEY:BPL -
  252. ; ╬OW SAPTR POINTS TO THE FIRST COL OF
  253. ; THE NEXT ROW, SO SAVE IT IN LCOLA
  254.   LDA SAPTR:STA LCOLA
  255.   LDA SAPTR+1:STA LCOLA+1
  256.   JSR ADD8          ;AND ADD 8 TO PTRS AGAIN
  257. ;
  258.   INC ROWCOUNT
  259.   LDX ROWCOUNT
  260.   CPX #25           ;CHECK FOR 25 DONE
  261.   BNE DOROW         ;AND DO NEXT IF NOT DONE
  262. ;
  263. ; ╘HE BITMAP HAS NOW BEEN MOVED. ╬OW MOVE
  264. ; THE COLOR ARRAY. ├OLOR ARRAY IS AT
  265. ; SCREEN LOCATION -$2000 +$0800
  266. ;
  267.   LDA SCREENA+1:AND #$C0:ORA #$08
  268.   STA SAPTR+1
  269.   STA LCOLA+1
  270.   LDA #1:STA SAPTR
  271.   LDA #0:STA SBPTR
  272.   STA LCOLA
  273.   LDA SCREENB+1:AND #$C0:ORA #$08
  274.   STA SBPTR+1
  275. ; ╞OR THIS, .┘ IS COL COUNT, .╪ IS ROW
  276. ;
  277.   LDX #0
  278. - LDY #0         ;REPEAT UNTIL 25 ROWS
  279. - LDA (SAPTR),Y  ;REPEAT UNTIL 40 COLUMNS
  280.   STA (SBPTR),Y
  281.   INY
  282.   CPY #39
  283.   BNE -
  284.   LDY #0
  285.   LDA (LCOLA),Y
  286.   LDY #39
  287.   STA (SBPTR),Y
  288.   JSR ADD40
  289.   LDA SAPTR:AND #$FE:STA LCOLA ;GET RID OF THE +1
  290.   LDA SAPTR+1:STA LCOLA+1
  291.   INX
  292.   CPX #25
  293.   BNE --
  294. ;
  295. ; ┴LL DONE.
  296. ;
  297.   PLA:STA LCOLA:PLA:STA LCOLA+1
  298. ;    (RESTORES ┬┴╙╔├ WORK AREA)
  299. ; ╘EST CODE... 
  300.   .IF DEBUG
  301.   LDA WORK:STA WORK+1 ;SAVE ╔╥╤ COUNTER
  302.   LDA #0:STA WORK     ;AND RESET IT.
  303.   .IFE
  304. ;
  305.   RTS
  306. ;
  307. ; ADD8: ADDS 8 TO SAPTR AND SBPTR.
  308. ;       ├ALLED 40 TIMES FOR EACH ROW.
  309. ADD8 = *
  310.   CLC
  311.   LDA SAPTR
  312.   ADC #8
  313.   STA SAPTR
  314.   BCC +
  315.   INC SAPTR+1
  316.   CLC
  317. + LDA SBPTR
  318.   ADC #8
  319.   STA SBPTR
  320.   BCC +
  321.   INC SBPTR+1
  322. + RTS
  323. ;
  324. ; ADD40: ADDS 40 TO SAPTR AND SBPTR.
  325. ;        ├ALLED ONCE FOR EACH ROW.
  326. ADD40 = *
  327.   CLC
  328.   LDA SAPTR
  329.   ADC #40
  330.   STA SAPTR
  331.   BCC +
  332.   INC SAPTR+1
  333.   CLC
  334. + LDA SBPTR
  335.   ADC #40
  336.   STA SBPTR
  337.   BCC +
  338.   INC SBPTR+1
  339. + RTS
  340. .DIS
  341. ;
  342.   .END
  343.